﻿#include <QCoreApplication>
#include <QApplication>
#include "copyfilethread1.h"
#include <QDebug>
#include "dialog.h"
#include "dialog3.h"

/* QThread类提供了一个与平台无关的方式来管理线程。
 *   首先用一个类继承QThread类，然后重新改写QThread类的虚函数run()。只需要实例该类，然后调用函数start()，就可以开启新的多线程（run()函数被自动调用）
 *   还有一种方法，即继承QObject类，然后调用moveToThread()函数开启一个线程槽函数，把要花费大量时间计算的代码放入该线程槽函数中。
 * C/C++程序都是从main()函数开始执行的。
 *   main()函数其实就是主进程的入口，main()函数退出了，则主进程就退出，整个进程也就结束了。
 *   对于使用Qthread类创建的进程而言，run()函数是新线程的入口，run()函数退出，就意味着线程的终止。
 * 创建多线程的步骤如下：
 *   （1）新建一个MyThread了，它的基类为QThread。
 *   （2）重写MyThread类的虚函数run()，即新建一个函数protected void run()，然后对其进行定义。
 *   （3）在需要用到多线程的地方实例化MyThread，然后调用函数MyThread::start()开启一个线程，自动运行函数run()。
 *   （4）当停止线程时，调用MyThread::wait()函数，等待线程结束，并回收线程占用的资源。
*/

int main(int argc, char *argv[])
{
    // 注意！！如果main函数是QCoreApplication而非QApplication，则窗体实例化时报错！！
//    QCoreApplication a(argc, argv);
    QApplication a(argc, argv);

    // 主线程的代码中生成一个CopyFileThread实例
    CopyFileThread1 m_cpyThread1;
    m_cpyThread1.start(); // 线程开始执行 注意，要调用start()函数来启动子线程，而不是run()函数。start()函数会自动调用run()函数。
    m_cpyThread1.wait(); // 等待线程退出
    qDebug() << "thread m_cpyThread1 is over.";

    /* 线程间通信 Qt线程间（数据）通信主要有两种方式：
     *   （1）使用共享内存，也就是使用两个线程都能够共享的变量（如全局变量），这样两个线程都能够访问和修改该变量，从而达到共享数据的目的。
     *   （2）使用信号／槽（Singal/Slot）机制，把数据从一个线程传递到另外一个线程。
     * 我们来看一个例子：
     *   子线程发送信号（信号参数是一个整数）给主线程，主线程得到这个信号后显示在标签控件上，子线程每隔一秒就累加一次整数，相当于一个计数器。
     *   主线程也可以发送信号给子线程，把计数器重置为0。这一来一往就实现了子线程和主线程的相互通信。
    */
    // 子线程和主线程之间的双向通信
    Dialog dialog2;
    dialog2.show();

    // 用进度条表示子进程中的计算进度
    Dialog3 dialog3;
    dialog3.show();

    return a.exec();
}
